package org.bp.ioc.config;

import java.lang.reflect.Field;
import java.util.Map;
import java.util.Set;

import org.bp.ioc.annotation.Inject;
import org.bp.ioc.utils.ObjectUtils;
import org.bp.ioc.utils.ReflectionUtils;

/**
 * 依赖注入
 *   将某个类所依赖的成员注入到该类中
 * 控制反转
 *   对象不是由开发者new出来的，而是通过框架自身实例化
 */
public final class IocHelper {
    /**
     * silu:
     * 1、获取所有映射
     * 2、遍历映射，寻找成员注解
     * 3、获取成员注解，并注入之
     */
    static {
        //获取所有映射
        Map<Class<?>, Object> beanMap = BeanHelper.getBeanMap();
        if(ObjectUtils.isNotNull(beanMap)) {
            Set<Map.Entry<Class<?>, Object>> entrySet = beanMap.entrySet();
            //遍历映射，寻找成员注解
            for (Map.Entry<Class<?>, Object> entry : entrySet) {
                Class<?> clazz = entry.getKey();
                Object obj = entry.getValue();
                Field[] fields = clazz.getDeclaredFields();
                if(ObjectUtils.isNotNull(fields)) {
                    for (Field field : fields) {
                        //获取成员注解，并注入之
                        if (field.isAnnotationPresent(Inject.class)) {
                            Object value = BeanHelper.getBean(field.getType());
                            if (ObjectUtils.isNotNull(value)) {
                                ReflectionUtils.setField(obj, field, value);
                            }
                        }
                    }
                }
            }
        }
    }
}
